home *** CD-ROM | disk | FTP | other *** search
/ Computer Active Guide 2009 September / CAG09.ISO / Programos / systemtweaker.exe / {app} / library.dat / decorator.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-11-12  |  6.5 KB  |  196 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. __all__ = [
  5.     'decorator',
  6.     'FunctionMaker',
  7.     'partial',
  8.     'deprecated',
  9.     'getinfo',
  10.     'new_wrapper']
  11. import os
  12. import sys
  13. import re
  14. import inspect
  15. import string
  16. import warnings
  17.  
  18. try:
  19.     from functools import partial
  20. except ImportError:
  21.     
  22.     class partial(object):
  23.         
  24.         def __init__(self, func, *args, **kw):
  25.             self.func = func
  26.             self.args = args
  27.             self.keywords = kw
  28.  
  29.         
  30.         def __call__(self, *otherargs, **otherkw):
  31.             kw = self.keywords.copy()
  32.             kw.update(otherkw)
  33.             return self.func(*self.args + otherargs, **kw)
  34.  
  35.  
  36.  
  37. DEF = re.compile('\\s*def\\s*([_\\w][_\\w\\d]*)\\s*\\(')
  38.  
  39. class FunctionMaker(object):
  40.     
  41.     def __init__(self, func = None, name = None, signature = None, defaults = None, doc = None, module = None, funcdict = None):
  42.         if func:
  43.             self.name = func.__name__
  44.             if self.name == '<lambda>':
  45.                 self.name = '_lambda_'
  46.             
  47.             self.doc = func.__doc__
  48.             self.module = func.__module__
  49.             if inspect.isfunction(func):
  50.                 argspec = inspect.getargspec(func)
  51.                 (self.args, self.varargs, self.keywords, self.defaults) = argspec
  52.                 for i, arg in enumerate(self.args):
  53.                     setattr(self, 'arg%d' % i, arg)
  54.                 
  55.                 self.signature = inspect.formatargspec(formatvalue = (lambda val: ''), *argspec)[1:-1]
  56.                 self.dict = func.__dict__.copy()
  57.             
  58.         
  59.         if name:
  60.             self.name = name
  61.         
  62.         if signature is not None:
  63.             self.signature = signature
  64.         
  65.         if defaults:
  66.             self.defaults = defaults
  67.         
  68.         if doc:
  69.             self.doc = doc
  70.         
  71.         if module:
  72.             self.module = module
  73.         
  74.         if funcdict:
  75.             self.dict = funcdict
  76.         
  77.         if not hasattr(self, 'signature'):
  78.             raise TypeError('You are decorating a non function: %s' % func)
  79.         hasattr(self, 'signature')
  80.  
  81.     
  82.     def update(self, func, **kw):
  83.         func.__name__ = self.name
  84.         func.__doc__ = getattr(self, 'doc', None)
  85.         func.__dict__ = getattr(self, 'dict', { })
  86.         func.func_defaults = getattr(self, 'defaults', ())
  87.         callermodule = sys._getframe(3).f_globals.get('__name__', '?')
  88.         func.__module__ = getattr(self, 'module', callermodule)
  89.         func.__dict__.update(kw)
  90.  
  91.     
  92.     def make(self, src_templ, evaldict = None, addsource = False, **attrs):
  93.         src = src_templ % vars(self)
  94.         if not evaldict:
  95.             pass
  96.         evaldict = { }
  97.         mo = DEF.match(src)
  98.         if mo is None:
  99.             raise SyntaxError('not a valid function template\n%s' % src)
  100.         mo is None
  101.         name = mo.group(1)
  102.         reserved_names = []([] + [ arg.strip(' *') for arg in self.signature.split(',') ])
  103.         for n, v in evaldict.iteritems():
  104.             if n in reserved_names:
  105.                 raise NameError('%s is overridden in\n%s' % (n, src))
  106.             n in reserved_names
  107.         
  108.         
  109.         try:
  110.             code = compile(src, '<string>', 'single')
  111.             exec code in evaldict
  112.         except:
  113.             None if not src.endswith('\n') else set
  114.             print >>sys.stderr, 'Error in generated code:'
  115.             print >>sys.stderr, src
  116.             raise 
  117.  
  118.         func = evaldict[name]
  119.         if addsource:
  120.             attrs['__source__'] = src
  121.         
  122.         self.update(func, **attrs)
  123.         return func
  124.  
  125.     
  126.     def create(cls, obj, body, evaldict, defaults = None, doc = None, module = None, addsource = True, **attrs):
  127.         if isinstance(obj, str):
  128.             (name, rest) = obj.strip().split('(', 1)
  129.             signature = rest[:-1]
  130.             func = None
  131.         else:
  132.             name = None
  133.             signature = None
  134.             func = obj
  135.         fun = cls(func, name, signature, defaults, doc, module)
  136.         ibody = '\n'.join((lambda .0: for line in .0:
  137. '    ' + line)(body.splitlines()))
  138.         return fun.make('def %(name)s(%(signature)s):\n' + ibody, evaldict, addsource, **attrs)
  139.  
  140.     create = classmethod(create)
  141.  
  142.  
  143. def decorator(caller, func = None):
  144.     if func is not None:
  145.         return FunctionMaker.create(func, 'return _call_(_func_, %(signature)s)', dict(_call_ = caller, _func_ = func), undecorated = func)
  146.     if isinstance(caller, partial):
  147.         return partial(decorator, caller)
  148.     f = inspect.getargspec(caller)[0][0]
  149.     return FunctionMaker.create('%s(%s)' % (caller.__name__, f), 'return decorator(_call_, %s)' % f, dict(_call_ = caller, decorator = decorator), undecorated = caller, doc = caller.__doc__, module = caller.__module__)
  150.  
  151.  
  152. def deprecated(func, *args, **kw):
  153.     warnings.warn('Calling the deprecated function %r\nDowngrade to decorator 2.3 if you want to use this functionality' % func.__name__, DeprecationWarning, stacklevel = 3)
  154.     return func(*args, **kw)
  155.  
  156. deprecated = decorator(deprecated)
  157.  
  158. def getinfo(func):
  159.     (regargs, varargs, varkwargs, defaults) = inspect.getargspec(func)
  160.     argnames = list(regargs)
  161.     if varargs:
  162.         argnames.append(varargs)
  163.     
  164.     if varkwargs:
  165.         argnames.append(varkwargs)
  166.     
  167.     signature = inspect.formatargspec(regargs, varargs, varkwargs, defaults, formatvalue = (lambda value: ''))[1:-1]
  168.     return dict(name = func.__name__, argnames = argnames, signature = signature, defaults = func.func_defaults, doc = func.__doc__, module = func.__module__, dict = func.__dict__, globals = func.func_globals, closure = func.func_closure)
  169.  
  170. getinfo = deprecated(getinfo)
  171.  
  172. def update_wrapper(wrapper, model, infodict = None):
  173.     if not infodict:
  174.         pass
  175.     infodict = getinfo(model)
  176.     wrapper.__name__ = infodict['name']
  177.     wrapper.__doc__ = infodict['doc']
  178.     wrapper.__module__ = infodict['module']
  179.     wrapper.__dict__.update(infodict['dict'])
  180.     wrapper.func_defaults = infodict['defaults']
  181.     wrapper.undecorated = model
  182.     return wrapper
  183.  
  184. update_wrapper = deprecated(update_wrapper)
  185.  
  186. def new_wrapper(wrapper, model):
  187.     if isinstance(model, dict):
  188.         infodict = model
  189.     else:
  190.         infodict = getinfo(model)
  191.     src = 'lambda %(signature)s: _wrapper_(%(signature)s)' % infodict
  192.     funcopy = eval(src, dict(_wrapper_ = wrapper))
  193.     return update_wrapper(funcopy, model, infodict)
  194.  
  195. new_wrapper = deprecated(new_wrapper)
  196.